<?php

# -- DÉBUT NOTE DE LICENCE -------------------------------------
#
# Ce fichier fait partie de Clicpage.
#
# Copyright (c) 2010 Francois (www.clicpage.net)
# Distribué selon les termes de la licence GPL version 2.0.
# Consultez le fichier LICENCE ou
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- FIN NOTE DE LICENCE ---------------------------------------

class gadgetMenu extends cpGadget
{
	
	
	private $jsConditions = array();
	
	
	private function adminListeItemsMenu($data)
	{
		
		$html = '';
		$this->jsConditions = array();
		$itemI = 1;
		
		foreach($data as $itemMenu)
		{
			
			switch($itemMenu['type']):
			
				case lienInterne:
					$htmlItem =
					'<p>'.
						'<label>'.__('Page').'</label>'.
						'<span class="selecteur_page_titre">'.__('[pas de sélection]').'</span>'.
						'<input class="selecteur_page_id" type="hidden" name="gadget['.$this->i.'][menuItems]['.$itemI.'][page_id]" value="'.(integer) $itemMenu['page_id'].'" />'.
						'<a id="gdg_'.$this->i.'_item'.$itemI.'_page_id"  href="#" class="selecteur_page_choisir">'.__('Choisir...').'</a>'.
					'</p>'.
					'<p>'.
						'<label>'.__('Titre du lien').'</label>'.
						'<input type="text" class="titreLien" id="gdg_'.$this->i.'_item'.$itemI.'_titre" name="gadget['.$this->i.'][menuItems]['.$itemI.'][titre]" size="40" value="'.html::escapeHTML($itemMenu['titre']).'" />'.
					'</p>';
				break;
				
				case lienExterne:
					$htmlItem = 
					'<p>'.
						'<label>'.__('URL du lien').'</label>'.
						'<input type="text" id="gdg_'.$this->i.'_item'.$itemI.'_url" name="gadget['.$this->i.'][menuItems]['.$itemI.'][url]" size="40" value="'.html::escapeHTML($itemMenu['url']).'" />'.
					'</p>'.
					'<p>'.
						'<label>'.__('Titre du lien').'</label>'.
						'<input type="text" id="gdg_'.$this->i.'_item'.$itemI.'_titre" name="gadget['.$this->i.'][menuItems]['.$itemI.'][titre]" size="40" value="'.html::escapeHTML($itemMenu['titre']).'" />'.
					'</p>';
				break;
				
				case liensConditions:

					$htmlItem = 
					'<p id="gdg_'.$this->i.'_item'.$itemI.'_conditions">'.__('Inclure les pages dont...').'</p>'.
					'<div class="conditions" id="gdg_'.$this->i.'_item'.$itemI.'_conteneurConditions"></div>'.
					'<p style="margin-top:15px;">'.
						'<label>'.__('Trier par').'</label>'.
						form::combo(
							array('gadget['.$this->i.'][menuItems]['.$itemI.'][tri_champ]', ''), # Nom du champ
							array(																 # Données
								__('Titre')					=> 'page_titre',
								__('URL')					=> 'page_url',
								__('Dossier')				=> 'cat_id',
								__('Date de création')		=> 'page_date',
								__('Date de modification')	=> 'page_date_modification'
							), 
							$itemMenu['tri'][0]												# Valeur par défaut
						).
						form::combo(
							array('gadget['.$this->i.'][menuItems]['.$itemI.'][tri_ordre]',
								  'gdg_'.$this->i.'_item'.$itemI.'_tri'), 					# Nom du champ
							array(															# Données
								__('ordre croissant')	=> 'asc',
								__('ordre décroissant')	=> 'desc'
							), 
							$itemMenu['tri'][1]												# Valeur par défaut
						).
					'</p>';
						
					$this->jsConditions[] =
						'var menuItemConditions_'.$this->i.'_'.$itemI.' = '.$this->core->conditionsPageToJs($itemMenu['conditions']).";\n".
						'$("#gdg_'.$this->i.'_item'.$itemI.'_conteneurConditions").cpConditionsPage("gadget['.$this->i.'][menuItems]['.$itemI.'][conditions]", menuItemConditions_'.$this->i.'_'.$itemI.', 1, 1);';
						
				break;
			
			endswitch;
			
			$html.= sprintf(
				'<div class="itemMenu" menuItemI="'.$itemI.'">'.
					'<input type="hidden" name="gadget['.$this->i.'][itemI][]" value="'.$itemI.'" />'.
					'<p>'.
						'<label>'.__('Type d\'item').'</label>'.
						form::combo(
							array('gadget['.$this->i.'][menuItems]['.$itemI.'][type]', ''),
							array(
								__('Lien interne')							=> 'lienInterne',
								__('Lien externe')							=> 'lienExterne',
								__('Liens internes selon des conditions')	=> 'liensConditions'
							),
							$itemMenu['type'],
							'typeItemMenu'
						).
					'</p>'.
					'<div class="detailsItemMenu">'.
						'%s'.
					'</div>'.
				'</div>', $htmlItem);
			
			$itemI++;
			
		}
		
		return $html;
	}
	
	
	public function adminInterface()
	{
		
		if(!empty($this->gadget_inst_data)) {
			$data = unserialize($this->gadget_inst_data);
		} else {
			$data = array();
		}
		
		$html = 
			'<p>'.
				'<label for="'.$this->champID('titre').'">'.__('Titre du menu').'</label>'.
				form::field($this->champNomID('titre'), 50, 50, $this->gadget_inst_titre).
			'</p>'.
			'<fieldset class="contenuMenuFieldset">'.
				form::hidden('menuItemI', count($data)+1).
				'<legend>'.__('Contenu du menu').'</legend>'.
				'<div id="'.$this->champID('contenuMenu').'" class="contenuMenu">'.
					$this->adminListeItemsMenu($data).
				'</div>'.
				'<a href="#" class="ajoutItemMenu">'.__('Ajouter un item au menu').'</a>'.
			'</fieldset>';
		
		$js = 'gdgMenu_'.$this->i.' = new gadgetMenu($("div.gadget[gadgetI=\''.$this->i.'\']"));
		gdgMenu_'.$this->i.'.initGadgetMenu();
		'.implode("\n", $this->jsConditions);
		
		return array(
			'html'			=> $html,
			'javascript'	=> $js
		);
		
	}

	
	public function preparerInstData(&$data)
	{
		
		if(empty($data['titre'])) {
			throw new cpErreur(__('Vous devez indiquer un titre.'), $this->champID('titre'), 101);
		}
		
		if(!is_array($data['itemI'])) {
			throw new cpErreur(__('Vous devez insérer au moins un item.'), $this->champID('contenuMenu'), 101);
		}
		
		$contenuMenu = array();
		
		foreach($data['itemI'] as $itemI)
		{
			$menuItem = $data['menuItems'][$itemI];
			
			switch($menuItem['type']):
			
				case lienInterne:
				
					if(empty($menuItem['page_id']) || !is_numeric($menuItem['page_id'])) {
						throw new cpErreur(__('Aucune sélection'), $this->champID('item'.$itemI.'_page_id'), 101);
					}
					
					if(empty($menuItem['titre'])) {
						throw new cpErreur(__('Vous devez indiquer un titre.'), $this->champID('item'.$itemI.'_titre'), 101);
					}
					
					$contenuMenu[] = array(
						'type'		=>	'lienInterne',
						'page_id'	=>	(integer) $menuItem['page_id'],
						'titre'		=>	$menuItem['titre']
					);
					
				break;
				
				
				case lienExterne:
					
					if(empty($menuItem['url'])) {
						throw new cpErreur(__('Vous devez indiquer une URL.'), $this->champID('item'.$itemI.'_url'), 101);
					}
					
					if(empty($menuItem['titre'])) {
						throw new cpErreur(__('Vous devez indiquer un titre.'), $this->champID('item'.$itemI.'_titre'), 101);
					}
					
					$contenuMenu[] = array(
						'type'		=>	'lienExterne',
						'url'		=>	$menuItem['url'],
						'titre'		=>	$menuItem['titre']
					);
					
				break;
				
				case liensConditions:
					
					try {
						$conditions = $this->core->parseConditionsPage($menuItem['conditions'], true);
					} catch (cpErreur $e) {
						throw new cpErreur($e->getMessage(), $this->champID('item'.$itemI.'_conditions'), 180);
					}
					
					if(!in_array($menuItem['tri_champ'], array(
						'page_titre', 'page_url', 'cat_id', 
						'page_date', 'page_date_modification'
					)) || !in_array($menuItem['tri_ordre'], array(
						'asc', 'desc'
					))) {
						throw new cpErreur(__('Donnée invalide'), $this->champID('item'.$itemI.'_tri'), 180);
					}
					
					$contenuMenu[] = array(
						'type'		=> 'liensConditions',
						'conditions'=> $conditions,
						'tri'		=> array($menuItem['tri_champ'], $menuItem['tri_ordre'])
					);
					
				break;
				
				default:
					throw new cpErreur(__('Donnée invalide'), null, 301);
				break;
			
			endswitch;

		}
		
		return serialize($contenuMenu);
		
	}
	
	
	public function public_contenu($_ctx)
	{
	
		$data = unserialize($this->gadget_inst_data);
		$liens = array();

		foreach($data as $menuItem)
		{
			switch($menuItem['type']):
				
				case lienInterne:
					$page = $this->core->site->getPages(array(
						'page_id' => (integer) $menuItem['page_id']
					), CP_GET_RS);
					
					if(!$page->isEmpty()) {
						$liens[] = array($menuItem['titre'], CP_URL_PUBLIQUE_RELATIVE.$page->page_url, $page->page_id == $_ctx->page->page_id);
					}
				break;
				
				case lienExterne:
					$liens[] = array($menuItem['titre'], $menuItem['url'], false);
				break;
				
				case liensConditions:
					$conditionsSql = $this->core->conditionsPageToSQL($menuItem['conditions'], $_ctx->categorie->cat_id);
					
					$pages = $this->core->site->getPages(array(
						'conditions_supp' 	=> array($conditionsSql),
						'page_statut'		=> 1,
						'order'				=> 'P.'.$this->core->con->escapeSystem($menuItem['tri'][0]).' '.$menuItem['tri'][1]
					), CP_GET_RS);
					
					while($pages->fetch())
					{
						$liens[] = array(
							$pages->page_titre,
							CP_URL_PUBLIQUE_RELATIVE.$pages->page_url,
							$page->page_id == $_ctx->page->page_id
						);
					}
					
				break;
			
			endswitch;
		}
		
		$html =
		'<ul class="menu">';
		
		foreach($liens as $lien)
		{
			if($lien[2])
			{
				$class = ' class="current"';
			}
			else
			{
				$class = '';
			}
			
			$html.=
			'<li'.$class.'><a href="'.html::escapeHTML($lien[1]).'">'.html::escapeHTML($lien[0]).'</a></li>';
		}
		
		$html.=		
		'</ul>';

		return $html;
		
	}

	
}

?>